package com.stedu.mall.goodsservice.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.stedu.mall.common.bean.Category;
import com.stedu.mall.common.exception.SteduException;
import com.stedu.mall.common.service.CategoryService;
import com.stedu.mall.goodsservice.mapper.CategoryMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public boolean insert(Category category) throws SteduException {
        /*
        * 判断被添加的分类对应的父类是否存在
        * 根据parentid查询其父分类
        * 1.不存在-抛出异常
        * 2.存在-判断这个父分类是否真的是父分类
        *   不是：抛出异常
        *   是：通过
        * */
        if (category.getParentId().equals(0)){
            //说明是子分类
            Category parent = categoryMapper.selectById(category.getParentId());
            if (parent == null || (parent != null && parent.getParentId().equals(0))){
                throw new SteduException("被添加分类的父分类不存在或不合法，无法添加");
            }
        }
        /*
        判断同一个父分类下是否有同名子分类
        1.查询同一个父分类下所有的子分类，判断是否重名
            是：
        * */
        List<Category> categoryList = categoryMapper.selectByParentId(category.getParentId());
        //判断是否重名
        boolean flag = categoryList.stream()
                .anyMatch(item -> item.getName().equals(category.getName()));
        if (flag){
            throw new SteduException("该父类中已经存在同名的分类，不允许添加");
        }

        return categoryMapper.insert(category)==1;
    }


    @Override
    public boolean delete(Integer id) throws SteduException {
        //判断被删除的分类是否存在
        Category category = categoryMapper.selectById(id);
        if (category == null){
            throw new SteduException("该分类不存在，不能删除");
        }
        //如果是父分类判断其下是否有子分类
        if (category.getParentId().equals(0) && category.getChildList().size() > 0){
            throw new SteduException("该分类存在子分类，不能删除");
        }
        //TODO 如果是子分类判断其下是否有商品
        //删除
        return categoryMapper.delete(id) == 1;
    }
    @Override
    public boolean update(Category category) throws SteduException {
        //查询被修改分类的详细信息
        Category oldInfo = categoryMapper.selectById(category.getId());
        Category newInfo = category;
        //判断被修改的分类是否存在
        if (oldInfo == null){
            throw new SteduException("该分类不存在，修改失败");
        }
        //如果该分类是父分类并且其下存在子分类，那么这个父分类就不能修改为子分类
        if (oldInfo.getParentId().equals(0) && oldInfo.getChildList().size() > 0 && (newInfo.getParentId() != null && !newInfo.getParentId().equals(0))){
            throw new SteduException("该分类存在子分类，不能修改为子分类");

        }
        //一个父分类不能把自己设置为自己父分类
        if (oldInfo.getParentId().equals(0) && !newInfo.getParentId().equals(0) && newInfo.getParentId().equals(oldInfo.getId())){
            throw new SteduException("不能将自己修改为子分类");
        }
        //判断同一个父分类下是否有同名的字分类-----查询修改之后同一个父分类下所有的的子分类，判断是否重名
        //获取修改之后的parentId和名字
        Integer parentId = newInfo.getParentId() == null ? oldInfo.getParentId() : newInfo.getParentId();
        String name = newInfo.getName() == null ? oldInfo.getName() : newInfo.getName();
        if(categoryMapper.selectByParentId(parentId)
                .stream()
                .anyMatch(item -> item.getName().equals(name) && !item.getId().equals(category.getId()))){
            throw new SteduException("修改之后的分类名和同级的其他分类名重复，不允许修改");
        }
        //修改
        return categoryMapper.update(category) == 1;
    }

    //分页和不分页都可以使用
    @Override
    public Object selectByCondition(Category condition, Integer pageNum, Integer pageSize) {
        if (pageNum == null){
            //不分页查询
            return categoryMapper.selectByCondition(condition);
        }else {
            //分页查询--设置分页参数，查询，创建分页信息的对象
            PageHelper.startPage(pageNum, pageSize);
            List<Category> categories = categoryMapper.selectByCondition(condition);
            PageInfo<Category> pageInfo = new PageInfo<>(categories);
            return pageInfo;
        }
    }

    @Override
    public Category selectById(Integer id) {
        return categoryMapper.selectById(id);
    }
}
